import java.awt.*;
import java.awt.event.*;
import java.util.StringTokenizer;

import javax.swing.*;

import org.omg.CORBA.ARG_INOUT;



public class Tablero extends JFrame implements ActionListener{	
	private JButton btnAux;
	private JButton btnGirar=null;
	private JButton arrBarcos[]=new JButton[5];
	private JPanel panel=new JPanel(new GridLayout(10,10));
	private JPanel panel2=new JPanel(new FlowLayout());
	private JFrame frAux=new JFrame();
	private Container cont=null;
	private boolean orientacion=false;
	private int longitud=0;
	private boolean banderaBarcosPuestos=false;
	private int contadorBarcosPuestos=0;
	private boolean banderaPoniendo=false;
	JButton matBotones[][]=new JButton[10][10];
	int matriz[][]=new int[10][10];
	Barco barcos[]=new Barco[5];
	private boolean repack=true;
	private Mensajero mens;
	
	public Tablero(Boolean param, Mensajero mens){
		this.mens=mens;
		addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
		cont=this.getContentPane();
		setTitle("tablero generado");
		setLayout(new BoxLayout(cont,BoxLayout.Y_AXIS));

		add(panel);
		for(int i=0;i<10;i++){
			for(int k=0;k<10;k++){
				btnAux=new JButton(" ");
				matBotones[i][k]=btnAux;
				btnAux.addActionListener(this);
				panel.add(matBotones[i][k]);
				matriz[i][k]=0;
			}
		}

		for(int i=0;i<5;i++){
			switch(i){
				case 0:longitud=2;break;
				case 1:
				case 2:longitud=3;break;
				case 3:longitud=4;break;
				case 4:longitud=5;break;
			}
			boolean error;
			int matrizAux[][]=new int[10][10];
			for(int j=0;j<10;j++){
				for(int k=0;k<10;k++){
					matrizAux[j][k]=matriz[j][k];
				}
			}
			Barco bAux=null;
			do{
				error=false;
				int x=(int)(Math.random()*10);
				int y=(int)(Math.random()*10);
				int direccion=(int)(Math.random()*4);
				if(direccion%2==0){
					orientacion=!orientacion;
				}
				try{
					bAux=new Barco(x,y,orientacion,longitud,matriz,i+1);
				}catch(Exception exc){
					error=true;
					for(int j=0;j<10;j++){
						for(int k=0;k<10;k++){
							matriz[j][k]=matrizAux[j][k];
						}
					}
				}
			}while(error);
			barcos[i]=bAux;
			contadorBarcosPuestos++;
//			System.out.println("puesto el barco "+(i+1));
		}
//		System.out.println("puestos todos los barcos");
		repack=false;
		todosPuestos();
		setSize(500,500);
		setVisible(true);
		setLocationRelativeTo(null);
	}
	
	public Tablero(Mensajero mens){
		this.mens=mens;
		addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
		cont=this.getContentPane();
		setTitle("Tablero del Jugador");
		setLayout(new BoxLayout(cont,BoxLayout.Y_AXIS));
		add(panel2);
		btnGirar=new JButton("Girar");
		btnGirar.addActionListener(this);
		panel2.add(btnGirar);
		for(int i=0;i<5;i++){
			btnAux=new JButton("Barco"+(i+1));
			btnAux.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e) {
					Object obj=e.getSource();
					JButton b=(JButton)obj;
					for(int i=0;i<arrBarcos.length;i++){
						if(b.equals(arrBarcos[i])){
							banderaPoniendo=true;
							switch(i){
							case 0:longitud=2;break;
							case 1:
							case 2:longitud=3;break;
							case 3:longitud=4;break;
							case 4:longitud=5;break;
							}
//							System.out.println("BTN BARCOS");
							banderaPoniendo=true;
							b.setEnabled(false);
						}
					}
				}					
			});
			arrBarcos[i]=btnAux;
			panel2.add(arrBarcos[i]);
		}	
		add(panel);
		for(int i=0;i<10;i++){
			for(int k=0;k<10;k++){
				btnAux=new JButton(" ");
				matBotones[i][k]=btnAux;
				btnAux.addActionListener(this);
				panel.add(matBotones[i][k]);
				matriz[i][k]=0;
			}
		}
		setSize(500,500);
		setVisible(true);
		setLocationRelativeTo(null);
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		Object obj=e.getSource();
		JButton b=(JButton)obj;
		if(b.equals(btnGirar)){
//			System.out.println("GIRAR");
			orientacion=!orientacion;
			
		}
		else{
//			System.out.println("TABLERO");
			StringTokenizer st=new StringTokenizer(buscarBoton(b),",");
			int x=Integer.parseInt(st.nextToken());
			int y=Integer.parseInt(st.nextToken());
			if(banderaPoniendo){
				try{
					Barco aux=new Barco(x,y,orientacion,longitud,matriz,contadorBarcosPuestos+1);
					barcos[contadorBarcosPuestos]=aux;
					contadorBarcosPuestos++;
					banderaPoniendo=false;	
					todosPuestos();
					deshabilitarBotones();
					if(banderaBarcosPuestos&&repack){
						repack=false;
						rePack();
					}	
				}catch(ArrayIndexOutOfBoundsException ex){
					try{
						Barco aux=new Barco(x,y,orientacion,longitud,matriz,0);
					}catch(ArrayIndexOutOfBoundsException exc){}
				}
			}else if(banderaBarcosPuestos){
				mens.probarCoor(x,y,this);		
			}
		}
	}
	public String buscarBoton(JButton param){
		for(int i=0;i<matBotones.length;i++){
			for(int k=0;k<matBotones.length;k++){
				if(param.equals(matBotones[i][k])){
					return i+","+k;
				}
			}
		}
		return "";
	}
		
	public void deshabilitarBotones(){
		for(int i=0;i<matBotones.length;i++){
			for(int k=0;k<matBotones.length;k++){
				if(matriz[i][k]!=0){
					matBotones[i][k].setEnabled(false);
					if(matriz[i][k]!=9){
						matBotones[i][k].setText("B");
					}
				}
			}
		}
	}
	public void todosPuestos(){
		if(contadorBarcosPuestos>=5){
			banderaBarcosPuestos=true;
//			verMatriz();
		}
	}
	
	
	public void rePack(){
		this.remove(panel2);
		for(int i=0;i<matBotones.length;i++){
			for(int k=0;k<matBotones.length;k++){
				matBotones[i][k].setEnabled(true);
			}
		}
		this.pack();
		setSize(500,500);
	}
	
	public boolean isRepack(){
		return repack;
	}
	
	public boolean finJuego(){
		for(int i=0;i<10;i++){
			for(int j=0;j<10;j++){
				if(matriz[i][j]!=0&&matriz[i][j]!=9){
					return false;
				}
			}
		}
		return true;
	}
	
	public void verMatriz(){
		for(int i=0;i<matriz.length;i++){
			for(int j=0;j<matriz.length;j++){
				System.out.print(matriz[i][j]);
			}
			System.out.println("");
		}
	}		
//	public static void main(String[]args){
//		Tablero cosa=new Tablero();
//
//	}
}
